file_pattern='^.*\.(mov|ts|mpg|mpeg|mp4|m4v|avi|mkv|flv|sfv|wmv|ogm|ogv|webm|iso|rmvb)$'
meta_name() {
- fn="$1"
- fn="${fn##*/}"
- fn="${fn%.*}"
- STRING "$fn"
- printf '\r'
+ local fn="${1##*/}"
+ STRING "${fn%.*}"
}
meta_line() {
+ local video probe l w h
video="$1"
+ [ "${video%.part}" = "$video" -a -s "$video" ] || return 0
- read l h w <<__EOF
- $(printf '' \
- | mplayer -input nodefault-bindings -nosound -vo null -identify -frames 0 "$video" 2>&- \
- | sort | sed -rn '
- s:ID_LENGTH=(.*)(\..*)$:\1:p;
- s:ID_VIDEO_HEIGHT=(.*):\1:p;
- s:ID_VIDEO_WIDTH=(.*):\1:p;' \
- | tr '\n' ' '
- )
-__EOF
- printf '%i\t%i\t%i\ttags=\tcomment=\t%s\n' \
- "${l-0}" "${w-0}" "${h-0}" "$(meta_name "$video")"
+ probe="$(printf \\n; ffprobe -show_entries format=duration:stream=width,height "$video" 2>&-)"
+ l="${probe#*duration=}" l="${l%%${BR}*}" l="${l%.*}"
+ w="${probe#*width=}" w="${w%%${BR}*}"
+ h="${probe#*height=}" h="${h%%${BR}*}"
+
+ printf '%i %i %i tags= comment= %s\r\n' \
+ "${l:-0}" "${w:-0}" "${h:-0}" "$(meta_name "$video")"
}
meta_file(){
+ local file meta name
file="$1"
meta="${file%/*}/.index/meta"
name="$(meta_name "$file")"
if [ -d "${meta%/meta}" ] && LOCK "$meta"; then
- grep -vF " ${name}" "$meta" >"$meta.tmp"
+ grep -avF " ${name}${CR}" "$meta" >"$meta.tmp"
meta_line "$file" \
| tee -a "$meta.tmp"
mv "$meta.tmp" "$meta"
fi
}
-meta_info(){
+meta_purge(){
+ local file meta name
file="$1"
meta="${file%/*}/.index/meta"
+ name="$(meta_name "$file")"
+
+ if [ -d "${meta%/meta}" ] && LOCK "$meta"; then
+ grep -avF " ${name}${CR}" "$meta" >"${meta}.tmp"
+ grep -aF " ${name}${CR}" "$meta" >>"${meta}.trash"
+ mv "${meta}.tmp" "$meta"
+ RELEASE "$meta"
+ fi
+}
+
+meta_info(){
+ local file meta
+ file="$1"; meta="${file%/*}/.index/meta"
if [ -d "${meta%/meta}" ]; then
- grep -m1 -F " $(meta_name "$file")" "$meta" \
- | grep -xE '[0-9]+ [0-9]+ [0-9]+ tags=[^ ]* comment=[^ ]* .+' \
+ grep -aF " $(meta_name "$file")${CR}" "$meta" \
+ | grep -m1 -axE '[0-9]+ [0-9]+ [0-9]+ tags=[^ ]* comment=[^ ]* .+' \
|| meta_file "$file"
else
- printf '0\t0\t0\ttags=\tcomment=\t\r'
+ printf '0\t0\t0\ttags=\tcomment=\t%s\r\n' "$(meta_name "$file")"
fi
}
meta_dir(){
+ local dir meta v
dir="${1}"
meta="${dir}/.index/meta"
+ metat="${dir}/.index/meta.time"
+
+ [ -f "$metat" ] || touch -d @0 "$metat"
if [ -d "$dir/.index" -a \! -f "$meta" ] && LOCK "$meta"; then
touch "$meta" # preliminary touch to prevent concurrent generators
- find "$dir" -type f -mindepth 1 -maxdepth 1 \
- | grep -E "$file_pattern" \
- | while v="$(line)"; do
+ find -L "$dir" -type f -mindepth 1 -maxdepth 1 \
+ | grep -aE "$file_pattern" \
+ | while read -r v; do
meta_line "$v"
done >"$meta"
+ touch "$metat"
RELEASE "$meta"
- elif [ -d "$dir/.index" -a "$dir" -nt "$meta" ] && LOCK "$meta"; then
+ elif [ -d "$dir/.index" -a "$dir" -nt "$metat" ] && LOCK "$meta"; then
touch "$meta"
- find "$dir" -type f -mindepth 1 -maxdepth 1 \
- | grep -E "$file_pattern" \
- | while v="$(line)"; do
- if [ "$v" -nt "$meta" ]; then
- grep -qF " $(meta_name "$v")" "$meta" \
- || meta_line "$v"
- fi
+ find -L "$dir" -type f -newer "$metat" \
+ -mindepth 1 -maxdepth 1 \
+ | grep -aE "$file_pattern" \
+ | while read -r v; do
+ grep -qF " $(meta_name "$v")${CR}" "$meta" \
+ || meta_line "$v"
done >>"$meta"
+ touch "$metat"
RELEASE "$meta"
fi